最新「じゃない」 AMI を AWS CLI で検索するまとめ
ちなみに
最新の AMI ID を得る方法についてはこちらを参照ください。
最新のECS-optimized AMI IDをParameter Storeから取得できるようになりました(Amazon Linuxもあるよ)
ここでは 訳あって古い AMI の ID を探しているんだけどマネジメントコンソールから探すの大変 というときに、AWS CLI を使って一覧取得・検索する方法をご紹介します。なるべく OS ベンダオフィシャルな AMI が検索されるようにしています。
なお、以下は東京リージョン ( ap-northeast-1 ) の結果となります。別のリージョンでお試しになる場合は --region
オプションで指定するか、AWS_DEFAULT_REGION
環境変数に記載をしてください。
export AWS_DEFAULT_REGION=ap-northeast-1
具体的な検索方法
Windows の場合
ひとくちに Windows といっても、バージョンや言語、SQL サーバを含む・含まないといった違いで様々な種類があります。
ここでは Windows Server 2012 R2 (日本語) に限定して一覧してみます。
aws ec2 describe-images \ --owners amazon \ --filters \ "Name=name,Values=Windows_Server-2012-R2_RTM-Japanese-64Bit-Base*" \ --query 'reverse(sort_by(Images, &Name))[].[Name,ImageId,CreationDate]' \ --output table
---------------------------------------------------------------------------------------- | DescribeImages | +------------------------------------------------------------+-------------------------+ | Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2019.02.13 | ami-01c4c164efd510022 | | Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2019.02.09 | ami-01847ac7578ef1007 | | Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2018.12.13 | ami-0fcaa969e6d634d90 | | Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2018.11.29 | ami-025158ca2047e8a24 | +------------------------------------------------------------+-------------------------+
--query
にて reverse(sort_by())
しているので、新しい順に並んでいます1。いまであれば 2018年 11月末に公開された AMI までは入手できるようです。
コマンドラインを見てもらうとわかるとおもいますが、4行目の Values=
で AMI 種別を示す文字列を指定してます。
ここに指定できる文字列にどんなものがあるかは、マネジメントコンソールや aws ec2 describe-images
の結果を眺めてもらうのがいいと思いますが、例えば「Windows_Server」かつ「Japanese」を含むものというとこれだけあります。参考にしてみてください。
aws ec2 describe-images \ --owners amazon \ --filters \ "Name=name,Values=Windows_Server*Japanese*" \ --query 'Images[].[Name]' \ --output text | \ sed -e 's/\-[0-9.]*$//' | sort | uniq
Windows_Server-2008-R2_SP1-Japanese-64Bit-Base Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Express Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Standard Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Web Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2012_SP4_Express Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2012_SP4_Standard Windows_Server-2012-R2_RTM-Japanese-64Bit-Base Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP2_Express Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP2_Standard Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP3_Express Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP3_Standard Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Enterprise Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Express Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Standard Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Web Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Enterprise Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Express Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Standard Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Web Windows_Server-2012-RTM-Japanese-64Bit-Base Windows_Server-2012-RTM-Japanese-64Bit-SQL_2008_R2_SP3_Express Windows_Server-2012-RTM-Japanese-64Bit-SQL_2008_R2_SP3_Standard Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Express Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Standard Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Web Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Express Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Standard Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Web Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Express Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Standard Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Web Windows_Server-2016-Japanese-Full-Base Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Enterprise Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Express Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Standard Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Web Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web Windows_Server-2019-Japanese-Full-Base
Amazon Linux の場合
( 2 では無いほうの)Amazon Linux の AMI を検索する場合は、仮想化タイプ( HVM )とルートデバイスタイプ( gp2 )をフィルタに含めて検索すると分かりやすいかなと思います。
例えば下記のような感じです。
aws ec2 describe-images \ --owners amazon \ --filters \ "Name=name,Values=amzn-ami-hvm*x86_64-gp2" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
------------------------------------------------------------------------------------- | DescribeImages | +---------------------------------------------------------+-------------------------+ | amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 | ami-00a5245b4816c38e6 | | amzn-ami-hvm-2018.03.0.20181116-x86_64-gp2 | ami-063fa8762cdc9a5a6 | : | amzn-ami-hvm-2014.09.0.x86_64-gp2 | ami-45072844 | | amzn-ami-hvm-2014.03.2.x86_64-gp2 | ami-df470ede | +---------------------------------------------------------+-------------------------+
2014年まで遡ることができますね! Windows と違い古いものから削除される、というわけではなさそうです。
ちなみに、仮想化タイプ PV、デバイスタイプ EBS を指定して検索すると、 2012年まで遡ることができました。
aws ec2 describe-images \ --owners amazon \ --filters \ "Name=name,Values=amzn-ami-pv*x86_64-ebs" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
------------------------------------------------------------------------------------ | DescribeImages | +--------------------------------------------------------+-------------------------+ | amzn-ami-pv-2018.03.0.20181129-x86_64-ebs | ami-078d6da9eeeeb9c1c | | amzn-ami-pv-2018.03.0.20181116-x86_64-ebs | ami-0b4de5a0bd1946dc7 | : | amzn-ami-pv-2012.03.2.x86_64-ebs | ami-903d8e91 | | amzn-ami-pv-2012.03.1.x86_64-ebs | ami-e47acbe5 | +--------------------------------------------------------+-------------------------+
Amazon Linux 2 (AL2) の場合
プレフィクスが amzn
に代わり amzn2
になります。あとは Amazon Linux (AL1) と同じでいいでしょう。AL1 のときよりいろいろとシンプルになっているので AMI の総量も少ないです。
aws ec2 describe-images \ --owners amazon \ --filters \ "Name=name,Values=amzn2-ami-hvm*x86_64-gp2" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
---------------------------------------------------------------------------- | DescribeImages | +------------------------------------------------+-------------------------+ | amzn2-ami-hvm-2.0.20190115-x86_64-gp2 | ami-0d7ed3ddb85b521a6 | | amzn2-ami-hvm-2.0.20190110-x86_64-gp2 | ami-0bab560bf1ee352f5 | | amzn2-ami-hvm-2.0.20181114-x86_64-gp2 | ami-0a2de1c3b415889d2 | | amzn2-ami-hvm-2.0.20181024-x86_64-gp2 | ami-00f9d04b3b3092052 | | amzn2-ami-hvm-2.0.20181008-x86_64-gp2 | ami-04d3eb2e1993f679b | | amzn2-ami-hvm-2.0.20180924-x86_64-gp2 | ami-06962fe7164c1fe7b | | amzn2-ami-hvm-2.0.20180810-x86_64-gp2 | ami-08847abae18baa040 | | amzn2-ami-hvm-2.0.20180622.1-x86_64-gp2 | ami-e99f4896 | | amzn2-ami-hvm-2017.12.0.20180509-x86_64-gp2 | ami-2724cf58 | | amzn2-ami-hvm-2017.12.0.20180328.1-x86_64-gp2 | ami-8fbab2f3 | | amzn2-ami-hvm-2017.12.0.20180115-x86_64-gp2 | ami-c2680fa4 | | amzn2-ami-hvm-2017.12.0.20180109-x86_64-gp2 | ami-6be57d0d | | amzn2-ami-hvm-2017.12.0.20171212.2-x86_64-gp2 | ami-2a34b64c | +------------------------------------------------+-------------------------+
途中で命名規則が変わっているのは、 RC から LTS に変わったからですかね。
Ubuntu Server
Ubuntu Linux も非常に種類がおおいので、バージョンまで含めて検索した方がいいと思いました。AMI のオーナーは Canonical 社( OwnerId : 099720109477 )を指定します。
例えば この春( '19/04 )に EOL が来る 14.04 (Trusty) の AMI を調べる場合は、下記のような指定がお勧めです。
aws ec2 describe-images \ --owners 099720109477 \ --filters \ "Name=name,Values=ubuntu/images/hvm-ssd*-14.04-*" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
------------------------------------------------------------------------------------------------ | DescribeImages | +--------------------------------------------------------------------+-------------------------+ | ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20190122.1 | ami-09a19edcb709d7a77 | | ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20190110 | ami-0864ee74b4ea9d002 | : | ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20140724 | ami-0589d404 | | ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20140607.1 | ami-a1124fa0 | +--------------------------------------------------------------------+-------------------------+
ちなみに、 10.04 (Lucid) まで残っていることが確認できました。
: | ubuntu/images/ebs/ubuntu-lucid-10.04-amd64-server-20120110 | ami-36e65037 | | ubuntu/images/ebs/ubuntu-lucid-10.04-i386-server-20120110 | ami-1ae6501b | +--------------------------------------------------------------------+---------------+
Red Hat Enterprise Linux
RHEL の場合は Red Hat 社( OwnerId : 309956199498 )がオーナーのものを検索します。フィルタは無しでも今のところそこまで数が多くないようですが、ノイズよけに行頭 RHEL-
で始まり GP2
で終わるるものと指定しておきましょう。
aws ec2 describe-images \ --owners 309956199498 \ --filters \ "Name=name,Values=RHEL-*GP2" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
------------------------------------------------------------------------------- | DescribeImages | +---------------------------------------------------+-------------------------+ | RHEL-8.0_HVM_BETA-20181113-x86_64-1-Hourly2-GP2 | ami-0d938ac9c11076133 | | RHEL-7.6_HVM_GA-20181017-x86_64-0-Hourly2-GP2 | ami-08419d23bf91152e4 | : | RHEL-5.11_Beta-i386-3-Hourly2-GP2 | ami-8bc79f8a | | RHEL-5.11_Beta-x86_64-3-Hourly2-GP2 | ami-29c59d28 | +---------------------------------------------------+-------------------------+
ちなみに、これはどの OS でも同じですが「AMI の有無とサポートの有無は無関係」であることにご注意ください。基本的には余所で使うときと同じ EOL が適用されます。
その他の OS を検索する場合(SUSE、 Deep Learning ...)
このような感じで、下記の情報で結果を絞っていくのがよいと思います。
- オーナー(
OwnerId
orImageOwnerAlias
) - 名前(
Name
)に含まれるキーワード - (場合によって)アーキテクチャや仮想化タイプ、ENAサポートなど
具体的には、探したい OS の最新の AMI ID をパラメータストアや EC2 マネジメントコンソールの「インスタンスの作成」から表示される「手順 1: Amazon マシンイメージ」等から取得し、
その AMI ID を元に describe-images
して情報を集めるのがよいと思います。
そうして見つけたキーワードを、--filters
の後ろに「Name=<キー>,Values=<パターン>
」の形式で指定します。Name
に指定するのは describe-images
で見つけたキーになりますが、出力された JSON そのままではないので注意が必要です。
下記ドキュメントの「--filters
」のところをみて、どのキーを指定すれば良いか確認して下さい。
おまけ : CentOS
CentOS は AWS オフィシャルの AMI ではなくコミュニティ AMI になるため、オーナーはマーケットプレースになります。ただそれだけだと膨大な数がリストアップされてしまうので、適切に filter しましょう。
aws ec2 describe-images \ --owners aws-marketplace \ --filters \ "Name=name,Values=CentOS Linux*HVM EBS*" \ --query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \ --output table
------------------------------------------------------------------------------------------------------------------------------------- | DescribeImages | +----------------------------------------------------------------------------------------------------------+------------------------+ | CentOS Linux 7 x86_64 HVM EBS ENA 1901_01-b7ee8a69-ee97-4a49-9e68-afaee216db2e-ami-05713873c6794f575.4 | ami-045f38c93733dd48d | | CentOS Linux 6 x86_64 HVM EBS ENA 1901_01-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-079f4a7926b6b99ab.4 | ami-02eb8e0986956e8d6 | : | CentOS Linux 6 x86_64 HVM EBS 1704_01-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-23285c35.4 | ami-d4d0e2b3 | | CentOS Linux 6 x86_64 HVM EBS 1602-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-21e6d54b.3 | ami-fa3d3f94 | +----------------------------------------------------------------------------------------------------------+------------------------+
なおパラメータを調べる際の最新の AMI ID はマネジメントコンソールでは分かりづらいのですが、公式 Wiki に情報がありますのでこちらを参照して下さい。
まとめ
運用をやっていると常に最新の AMI だけ使えていればいいわけではなく、検証や試験目的で昔の AMI が欲しくなります。そんなときにお役に立てれば幸いです。
脚注
-
こういう用途の場合、AMI の
CreationDate
を使いたくなるところなのですが、例えばami-025158ca2047e8a24
のnoCreationDate
が2019-02-09T04:43:32.000Z
だったりしてちゃんと並ぶのかどうか微妙だったので、名前でソートしています。Linuxの場合はそこまで名前と差異がなかったので使っています。 ↩